package org.eredlab.g4.rif.report.excel;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eredlab.g4.ccl.util.G4Constants;
import org.eredlab.g4.ccl.util.G4Utils;

/**
 * 导出Excel的模板对象
 * 
 * @author XiongChun
 * @since 2010-08-12
 */

//用于将指定的单元格装进对应的集合中！
public class ExcelTemplate {

	private Log log = LogFactory.getLog(ExcelTemplate.class);
	//注意这些集合是装载解析出来的对应单元格，值类本身解析的不能去给他们赋值，只能在外部调用查看！
	private List staticObject = null;
	private List parameterObjct = null;
	private List fieldObjct = null;
	private List variableObject = null;
	private String templatePath = null;

	public ExcelTemplate(String pTemplatePath) {
		templatePath = pTemplatePath;
	}
	
	public ExcelTemplate() {
	}
	
	/**
	 * 解析Excel模板
	 */
	public void parse(HttpServletRequest request) 
	{
		System.out.println("开始装载模型参数！");
		staticObject = new ArrayList();
		parameterObjct = new ArrayList();
		fieldObjct = new ArrayList();
		variableObject = new ArrayList();
		if(G4Utils.isEmpty(templatePath))
		{
			log.error(G4Constants.Exception_Head + "Excel模板路径不能为空!");
		}
		//templatePath = request.getSession().getServletContext().getRealPath(templatePath);
		//对模板文件创建一个输入流！
        InputStream is = request.getSession().getServletContext().getResourceAsStream(templatePath); 
		if(G4Utils.isEmpty(is))
		{
			log.error(G4Constants.Exception_Head + "未找到模板文件,请确认模板路径是否正确[" + templatePath + "]");
		}
		//创建一个工作薄对象！
		Workbook workbook = null;
		try 
		{
			//读取一个现有的工作薄，此时只能对这个excel进行读而不能写！而这里只需要读就够了，将那些对应的模板参数读取出来，添加到对应的集合中！
			workbook = Workbook.getWorkbook(is);
		} 
		catch (Exception e) 
		{
			e.printStackTrace();
		}
		//第一个工作表，工作表的下标是从0开始的！
		Sheet sheet = workbook.getSheet(0);
		if (G4Utils.isNotEmpty(sheet)) 
		{
			//得到当前工作表总共的行数！
			int rows = sheet.getRows();
			System.out.println("提示：有"+rows+"行。。。。。。。。。。。。。。。。。。。。。。。。");
			for (int k = 0; k < rows; k++) 
			{
				//得当当前行数下的所有单元格数组！
				Cell[] cells = sheet.getRow(k);
				System.out.println("提示：当前是第"+k+"行行数据。。。。。。。。。。。。。。。");
				//开始便利每个单元格
				for (int j = 0; j < cells.length; j++)
				{
					//得到当前行中的第j个单元格，单元格的下标也是从0开始的！
					String cellContent = cells[j].getContents().trim();
					System.out.println("提示：第"+k+"行的第"+j+"个单元格的内容是："+cellContent);
					//如果不能与空就开始替换当前excel模板中的参数！根据前缀来判断！
					if (!G4Utils.isEmpty(cellContent)) 
					{
						//如果单元格中数据是指定前缀开头的就添加到对应的集合中，这里的p代表参数,f代表字段,v代表可变参数
						if (cellContent.indexOf("$P") != -1 || cellContent.indexOf("$p") != -1)
						{
							//对应的参数集合中装载的是单元格对象！
							parameterObjct.add(cells[j]);
						} 
						else if (cellContent.indexOf("$F") != -1 || cellContent.indexOf("$f") != -1) 
						{
							fieldObjct.add(cells[j]);
						} 
						else if(cellContent.indexOf("$V") != -1 || cellContent.indexOf("$v") != -1)
						{
							variableObject.add(cells[j]);
						}
						else 
						{
							//如果不是带有参数的代表的静态值，不需要替代的也用一个集合保存起来！
							staticObject.add(cells[j]);
						}
					}
				}
			}
		}
		else
		{
			log.error("模板工作表对象不能为空!");
		}
		System.out.println("参数装载完毕！");
	}

	/**
	 * 增加一个静态文本对象
	 */
	public void addStaticObject(Cell cell) {
		staticObject.add(cell);
	}

	/**
	 * 增加一个参数对象
	 */
	public void addParameterObjct(Cell cell) {
		parameterObjct.add(cell);
	}

	/**
	 * 增加一个字段对象
	 */
	public void addFieldObjct(Cell cell) {
		fieldObjct.add(cell);
	}


	public List getStaticObject() {
		return staticObject;
	}

	public List getParameterObjct() {
		return parameterObjct;
	}

	public List getFieldObjct() {
		return fieldObjct;
	}

	public String getTemplatePath() {
		return templatePath;
	}

	public void setTemplatePath(String templatePath) {
		this.templatePath = templatePath;
	}

	public List getVariableObject() {
		return variableObject;
	}

}
